#!/bin/bash -e

# compare if version1 < version2
versionLT() {
	local v1; v1=$(echo $1 | cut -d '-' -f 1 )
	local q1; q1=$(echo $1 | cut -s -d '-' -f 2- )
	local v2; v2=$(echo $2 | cut -d '-' -f 1 )
	local q2; q2=$(echo $2 | cut -s -d '-' -f 2- )
	if [ "$v1" = "$v2" ]; then
		if [ "$q1" = "$q2" ]; then
			return 1
		else
			if [ -z "$q1" ]; then
				return 1
			else
				if [ -z "$q2" ]; then
					return 0
				else
					[  "$q1" = "`echo -e "$q1\n$q2" | sort -V | head -n1`" ]
				fi
			fi
		fi
	else
		[  "$v1" = "`echo -e "$v1\n$v2" | sort -V | head -n1`" ]
	fi
}

# returns a plugin version from a plugin archive
get_plugin_version() {
	local archive; archive=$1
	local version; version=$(unzip -p $archive META-INF/MANIFEST.MF | grep "^Plugin-Version: " | sed -e 's#^Plugin-Version: ##')
	version=${version%%[[:space:]]}
	echo $version
}

# Copy files from /usr/share/jenkins/ref into $JENKINS_HOME
# So the initial JENKINS-HOME is set with expected content.
# Don't override, as this is just a reference setup, and use from UI
# can then change this, upgrade plugins, etc.
copy_reference_file() {
	f="${1%/}"
	b="${f%.override}"
	rel="${b:23}"
	version_marker="${rel}.version_from_image"
	dir=$(dirname "${b}")
	local action;
	local reason;
	local container_version;
	local image_version;
	local marker_version;
	local log; log=false
	if [[ ${rel} == plugins/*.jpi ]]; then
	    container_version=$(get_plugin_version $JENKINS_HOME/${rel})
        image_version=$(get_plugin_version ${f})
	    if [[ -e $JENKINS_HOME/${version_marker} ]]; then
            marker_version=$(cat $JENKINS_HOME/${version_marker})
            if versionLT $marker_version $container_version; then
                action="SKIPPED"
                reason="Installed version ($container_version) has been manually upgraded from initial version ($marker_version)"
                log=true
            else
                if [[ "$image_version" == "$container_version" ]]; then
                    action="SKIPPED"
                    reason="Version from image is the same as the installed version $image_version"
                else
                    if versionLT $image_version $container_version; then
                        action="SKIPPED"
                        log=true
                        reason="Image version ($image_version) is older than installed version ($container_version)"
                    else
                        action="UPGRADED"
                        log=true
                        reason="Image version ($image_version) is newer than installed version ($container_version)"
                    fi
                fi
            fi
        else
            if [[ -n "$TRY_UPGRADE_IF_NO_MARKER" ]]; then
                if [[ "$image_version" == "$container_version" ]]; then
                    action="SKIPPED"
                    reason="Version from image is the same as the installed version $image_version (no marker found)"
                    # Add marker for next time
                    echo $image_version > $JENKINS_HOME/${version_marker}
                else
                    if versionLT $image_version $container_version; then
                        action="SKIPPED"
                        log=true
                        reason="Image version ($image_version) is older than installed version ($container_version) (no marker found)"
                    else
                        action="UPGRADED"
                        log=true
                        reason="Image version ($image_version) is newer than installed version ($container_version) (no marker found)"
                    fi
                fi
            fi
		fi
        if [[ ! -e $JENKINS_HOME/${rel} || "$action" == "UPGRADED" || $f = *.override ]]; then
            action=${action:-"INSTALLED"}
            log=true
            mkdir -p "$JENKINS_HOME/${dir:23}"
            cp -r "${f}" "$JENKINS_HOME/${rel}";
		    # pin plugins on initial copy
		    touch "$JENKINS_HOME/${rel}.pinned"
            echo $image_version > $JENKINS_HOME/${version_marker}
            reason=${reason:-$image_version}
        else
            action=${action:-"SKIPPED"}
	    fi
    else
        if [[ ! -e $JENKINS_HOME/${rel} || $f = *.override ]]
        then
            action="INSTALLED"
            log=true
            mkdir -p "$JENKINS_HOME/${dir:23}"
            cp -r "${f}" "$JENKINS_HOME/${rel}";
        else
            action="SKIPPED"
        fi
	fi
	if [[ -n "$VERBOSE" || "$log" == "true" ]]; then
        if [ -z "$reason" ]; then
            echo "$action $rel" >> "$COPY_REFERENCE_FILE_LOG"
        else
            echo "$action $rel : $reason" >> "$COPY_REFERENCE_FILE_LOG"
        fi
	fi
}